package com.webermagem.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.hibernate.Session;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import com.webermagem.DAO.IntervencaoDAO;
import com.webermagem.DAO.DiagnosticoDAO;
import com.webermagem.model.Intervencao;
import com.webermagem.model.IntervencaoDataModel;
import com.webermagem.model.Diagnostico;
import com.webermagem.util.SessionManager;

@ManagedBean
@SessionScoped
public class IntervencaoController implements Serializable {

	private static final long serialVersionUID = 1L;

	private Intervencao novoIntervencao = new Intervencao();
	private Intervencao intervencao;
	private Intervencao intervencaoPesq = new Intervencao();
	private List<Intervencao> listaIntervencoes;
	private List<SelectItem> listaDiagnosticos;
	private IntervencaoDataModel intervencaoModel;
	private IntervencaoDAO intervencaoDao = new IntervencaoDAO();
	private DiagnosticoDAO diagnosticoDao = new DiagnosticoDAO();
	
	private Set<Diagnostico> diagnosticosSelecionados = new HashSet<Diagnostico>();

	private Diagnostico diagnosticoSelecionado = new Diagnostico();
	
	// ADICIONA
	public void adicionarIntervencao(ActionEvent actionEvent){
		
//		Set<Diagnostico> diagnosticoAux = new HashSet<Diagnostico>();
//		
//		diagnosticoAux.add(diagnosticoSelecionado);
//		
//		novoIntervencao.setDignosticos(diagnosticoAux);
		
		novoIntervencao.setDiagnosticos(diagnosticosSelecionados);
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("user", novoIntervencao);
		
		intervencaoDao.save((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), novoIntervencao);
		
		facesContext.addMessage(null, new FacesMessage("Sucesso", "Intervencao adicionado com Sucesso!"));
		novoIntervencao = new Intervencao();
		
	}
	
    public void onRowSelect(SelectEvent event) {
    	intervencao = (Intervencao)(intervencaoModel.getRowData());
    }
    
	// ALTERA
	public void alterarIntervencao(ActionEvent actionEvent){
		
//		Set<Diagnostico> diagnosticoAux = new HashSet<Diagnostico>();
//		
//		diagnosticoAux.add(diagnosticoSelecionado);
//		
//		novoIntervencao.setDignosticos(diagnosticoAux);

		novoIntervencao.setDiagnosticos(diagnosticosSelecionados);
		
		//intervencao.setDiagnosticos(diagnosticosSelecionados);
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		intervencaoDao.update((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), intervencao);
		  
		facesContext.addMessage(null, new FacesMessage("Sucesso", "Intervencao atualizado com Sucesso!"));
	}

	// EXCLUIR
	public void excluirIntervencao(ActionEvent actionEvent){
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		intervencaoDao.remove((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), intervencao);
		  
		facesContext.addMessage(null, new FacesMessage("Sucesso", "Intervencao excluido com Sucesso!"));
	}
	
	// CONSULTAR
	public void pesquisarIntervencao(ActionEvent actionEvent){
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("user", intervencaoPesq);
		
	}
	
	// GETS E SETTERS

	public IntervencaoDAO getIntervencaoDao() {
		return intervencaoDao;
	}

	public void setIntervencaoDao(IntervencaoDAO intervencaoDao) {
		this.intervencaoDao = intervencaoDao;
	}

	public Intervencao getIntervencao() {
		return intervencao;
	}

	public void setIntervencao(Intervencao intervencao) {
		this.intervencao = intervencao;
	}

	public IntervencaoDataModel getIntervencaoModel() {
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		if(intervencaoPesq == null ||  intervencaoPesq.getDescricao() == null || intervencaoPesq.getDescricao().equals("") ) {
			
			listaIntervencoes = (List<Intervencao>) intervencaoDao.listOrdenado((Session)SessionManager.getSessionAttribute(facesContext, "transacao"));
			
			listaDiagnosticos = new ArrayList<SelectItem>();
			for (Object objeto : diagnosticoDao.list((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), " from Diagnostico ")) {
				Diagnostico diagnostico = (Diagnostico)objeto;
	            listaDiagnosticos.add(new SelectItem(diagnostico, diagnostico.getDescricao()));  
	        } 
			
		} else {
			
			listaIntervencoes = intervencaoDao.ListByDescricao((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), intervencaoPesq.getDescricao());
			
		}
		
		intervencaoModel = new IntervencaoDataModel(listaIntervencoes);
		
		return intervencaoModel;
		
	}

	public void setIntervencaoModel(IntervencaoDataModel intervencaoModel) {
		this.intervencaoModel = intervencaoModel;
	}

	public List<Intervencao> getListaIntervencoes() {
		return listaIntervencoes;
	}

	public void setListaIntervencoes(List<Intervencao> listaIntervencoes) {
		this.listaIntervencoes = listaIntervencoes;
	}

	public Intervencao getNovoIntervencao() {
		return novoIntervencao;
	}

	public void setNovoIntervencao(Intervencao novoIntervencao) {
		this.novoIntervencao = novoIntervencao;
	}

	public Intervencao getIntervencaoPesq() {
		return intervencaoPesq;
	}

	public void setIntervencaoPesq(Intervencao intervencaoPesq) {
		this.intervencaoPesq = intervencaoPesq;
	}

	public List<SelectItem> getListaDiagnosticos() {
		return listaDiagnosticos;
	}

	public void setListaDiagnosticos(List<SelectItem> listaDiagnosticos) {
		this.listaDiagnosticos = listaDiagnosticos;
	}

	public Diagnostico getDiagnosticoSelecionado() {
		return diagnosticoSelecionado;
	}

	public void setDiagnosticoSelecionado(Diagnostico diagnosticoSelecionado) {
		this.diagnosticoSelecionado = diagnosticoSelecionado;
	}

	public Set<Diagnostico> getDiagnosticosSelecionados() {
		return diagnosticosSelecionados;
	}

	public void setDiagnosticosSelecionados(
			Set<Diagnostico> diagnosticosSelecionados) {
		this.diagnosticosSelecionados = diagnosticosSelecionados;
	}
	
}